package juctest;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author 江岸
 * @version V1.0
 * @ClassName: TestThreadPool
 * @description: 线程池
 * 首先用工具类Executors创建线程池，然后给线程池分配任务，最后关闭线程池
 * @date 2021/3/2017:06
 * @since V1.0
 */
public class TestThreadPool {


    public static void main(String[] args) {
        ThreadPoolDemo tp = new ThreadPoolDemo();
        //1.创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(3);
        //2.为线程池中的线程分配任务
        for (int i = 0; i < 5; i++) {
            pool.submit(tp);//有返回值
        }
        //pool.execute(tp); 无返回值


        /*
         * submit()返回的是一个RunnableFuture类对象，真正是通过newTaskFor()方法返回一个new FutureTask()对象。
         * 所以submit()返回的真正的对象是FutureTask对象。
         * 通过继承关系我们可以明确的知道其实FutureTask就是一个Runnable。并且有自己run()实现。
         */
//        for (int i = 0; i < 5; i++) {
//            Future<String> future = pool.submit(new Callable<String>() {
//                @Override
//                public String call() throws Exception {
//                    Thread.sleep(500);
//                    System.out.println("submit方法执行任务完成" + "   thread name: " + Thread.currentThread().getName());
//                    return "success";
//                }
//            });
//            try {
//                String s = future.get();
//                if ("success".equals(s)) {
//                    String name = Thread.currentThread().getName();
//                    System.out.println("经过返回值比较，submit方法执行任务成功    thread name: " + name);
//                }
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            } catch (ExecutionException e) {
//                e.printStackTrace();
//            }
//        }


        //3.关闭线程池
        pool.shutdown();
    }
}

class ThreadPoolDemo implements Runnable {
    private AtomicInteger integer = new AtomicInteger(100) ;

    @Override
    public void run() {
        while (true ) {
            try {
                Thread.sleep(10);
                if (integer.getAndDecrement()>0){
                    System.out.println(Thread.currentThread().getName() + ":" + integer.intValue());
                }else {
                    break;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
